﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Text.RegularExpressions;

namespace DataAccessComponents
{
    /// <summary>
    /// Klasa odzwierciedlająca tabele "Adres" z bazy danych
    /// </summary>
    public class Adres : INotifyPropertyChanged,IDataErrorInfo
    {
        /// <summary>
        /// Zmienna zawierająca id_adres klienta
        /// </summary>
        private int id_adres;
        
        public int Id_adres
        {
            get { return this.id_adres; }
            set { this.id_adres = value; NotifyPropertyChanged("Id_adres"); }
        }

        /// <summary>
        /// Zmienna zawierająca ulice zamieszkania klienta
        /// </summary>
        private string ulica;

        public string Ulica
        {
            get { return this.ulica; }
            set { this.ulica = value; NotifyPropertyChanged("Ulica"); }
        }

        /// <summary>
        /// Zmienna zawierająca numer domu klienta
        /// </summary>
        private string nr_domu;

        public string Nr_domu
        {
            get { return this.nr_domu; }
            set { this.nr_domu = value; NotifyPropertyChanged("Nr_domu"); }
        }

        /// <summary>
        /// Zmienna zawierająca kod pocztowy klienta
        /// </summary>
        private string kod_pocztowy;

        public string Kod_pocztowy
        {
            get { return this.kod_pocztowy; }
            set { this.kod_pocztowy = value; NotifyPropertyChanged("Kod_pocztowy"); }
        }

        /// <summary>
        /// Zmienna zawierająca wojewodztwo zamieszkania klienta
        /// </summary>
        private string wojewodztwo;

        public string Wojewodztwo
        {
            get { return this.wojewodztwo; }
            set { this.wojewodztwo = value; NotifyPropertyChanged("Wojewodztwo"); }
        }

        /// <summary>
        /// Zmienna zawierająca kraj zamieszkania klienta
        /// </summary>
        private string kraj;

        public string Kraj
        {
            get { return this.kraj; }
            set { this.kraj = value; NotifyPropertyChanged("Kraj"); }
        }

        /// <summary>
        /// Zmienna zawierająca miasto zamieszkania klienta
        /// </summary>
        private string miasto;

        public string Miasto
        {
            get { return this.miasto; }
            set { this.miasto = value; NotifyPropertyChanged("Miast"); }
        }

        /// <summary>
        /// Konstruktor klasy Adres
        /// </summary>
        /// <param name="id_adres">Id adres klienta w tabeli</param>
        /// <param name="ulica">Ulica zamieszkania</param>
        /// <param name="nr_domu">Nr domu zamieszkania</param>
        /// <param name="kod_pocztowy">Kod pocztowy</param>
        /// <param name="wojewodztwo">Wojewodztwo</param>
        /// <param name="kraj">Kraj</param>
        /// <param name="miasto">Miasto</param>
        public Adres(int id_adres, string ulica, string nr_domu, string kod_pocztowy, string wojewodztwo, string kraj, string miasto)
        {
            this.id_adres = id_adres;
            this.ulica = ulica;
            this.nr_domu = nr_domu;
            this.kod_pocztowy = kod_pocztowy;
            this.wojewodztwo = wojewodztwo;
            this.kraj = kraj;
            this.miasto = miasto;
        }

        /// <summary>
        /// Konstrukotr bezparametrowy
        /// </summary>
        public Adres()
            : this(0, "", "", "", "", "", "")
        { }

        #region INotifyPropertyChanged Members
        public event PropertyChangedEventHandler PropertyChanged;
        #endregion

        #region Private Helpers
        private void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

            }
        }
        #endregion

        public override bool Equals(object obj)
        {
            if (obj == null)
                return false;

            //Weryfikacja typów
            if (this.GetType() != obj.GetType())
                return false;

            Adres innyObj = (Adres)obj;

            //if (!id_adres.Equals(innyObj.id_adres)) return false;
            if (!ulica.Equals(innyObj.ulica)) return false;
            if (!nr_domu.Equals(innyObj.nr_domu)) return false;
            if (!kod_pocztowy.Equals(innyObj.kod_pocztowy)) return false;
            if (!wojewodztwo.Equals(innyObj.wojewodztwo)) return false;
            if (!kraj.Equals(innyObj.kraj)) return false;
            if (!miasto.Equals(innyObj.miasto)) return false;

            return true;

        }
        public override int GetHashCode()
        {
            return this.id_adres.GetHashCode();
        }

        public string Error
        {
            get { return string.Empty; }
        }

        public string this[string propertyName]
        {
            get {
                string result = string.Empty;
                propertyName = propertyName ?? string.Empty;

                if (propertyName == "Ulica")
                {
                    if (string.IsNullOrEmpty(this.Ulica))
                    {
                        result = "Pole \"Ulica\" nie może być puste";
                    }
                    else if (Regex.IsMatch(this.Ulica, @"[@£_^{}\[~\]|ÆæßÉ!¤%&'()\*\+,-.:;<=>§?]+"))
                    {
                        result = "Pole \"Ulica\" zawiera niedozwolone znaki";
                    }

                }
                else if (propertyName == "Nr_domu")
                {
                    if (string.IsNullOrEmpty(this.Nr_domu))
                    {
                        result = "Pole \"Nr_domu\" nie może być puste";
                    }
                    else if (!Regex.IsMatch(this.Nr_domu, "^[0-9]+\\w?$"))
                    {
                        result = "Pole \"Nr_domu\" zawiera niedozwolone znaki";
                    }
                }
                else if (propertyName == "Kod_pocztowy")
                {
                    if (string.IsNullOrEmpty(this.Kod_pocztowy))
                    {
                        result = "Pole \"Kod_pocztowy\" nie może być puste";
                    }
                    else if (Regex.IsMatch(this.Kod_pocztowy, @"[@£_^{}\[~\]|ÆæßÉ!¤%&'()\*\+,.:;<=>§?]+"))
                    {
                        result = "Pole \"Kod_pocztowy\" zawiera niedozwolone znaki";
                    }
                    else if (!Regex.IsMatch(this.Kod_pocztowy, "^[0-9]{2}-[0-9]{3}$"))
                    {
                        result = "Nie prawidłowy format kodu pocztowego.";
                    }
                }
                else if (propertyName == "Wojewodztwo")
                {
                    if (string.IsNullOrEmpty(this.Wojewodztwo))
                    {
                        result = "Pole \"Wojewodztwo\" nie może być puste";
                    }
                    else if (Regex.IsMatch(this.Wojewodztwo, @"[@#$£_^{}\[~\]|ÆæßÉ!¤%&'()\*\+,-.:;<=>§?0-9]+"))
                    {
                        result = "Pole \"Wojewodztwo\" zawiera niedozwolone znaki";
                    }

                }
                else if (propertyName == "Kraj")
                {
                    if (string.IsNullOrEmpty(this.Kraj))
                    {
                        result = "Pole \"Kraj\" nie może być puste";
                    }
                    else if (Regex.IsMatch(this.Kraj, @"[@#$£_^{}\[~\]|ÆæßÉ!¤%&'()\*\+,.:;<=>§?0-9]+"))
                    {
                        result = "Pole \"Kraj\" zawiera niedozwolone znaki";
                    }

                }
                else if (propertyName == "Miasto")
                {
                    if (string.IsNullOrEmpty(this.Miasto))
                    {
                        result = "Pole \"Miasto\" nie może być puste";
                    }
                    else if (Regex.IsMatch(this.Miasto, @"[@#$£_^{}\[~\]|ÆæßÉ!¤%&'()\*\+,.:;<=>§?0-9]+"))
                    {
                        result = "Pole \"Miasto\" zawiera niedozwolone znaki";
                    }

                }

                return result;
            }
        }
    }
}
